<?php

/**
 * Class representing a KeyDescriptor element.
 *
 * @package simpleSAMLphp
 * @version $Id$
 */
class SAML2_XML_md_KeyDescriptor {

	/**
	 * What this key can be used for.
	 *
	 * 'encryption', 'signing' or NULL.
	 *
	 * @var string|NULL
	 */
	public $use;


	/**
	 * The KeyInfo for this key.
	 *
	 * @var SAML2_XML_ds_KeyInfo
	 */
	public $KeyInfo;


	/**
	 * Supported EncryptionMethods.
	 *
	 * Array of SAML2_XML_Chunk objects.
	 *
	 * @var array
	 */
	public $EncryptionMethod = array();


	/**
	 * Initialize an KeyDescriptor.
	 *
	 * @param DOMElement|NULL $xml  The XML element we should load.
	 */
	public function __construct(DOMElement $xml = NULL) {

		if ($xml === NULL) {
			return;
		}

		if ($xml->hasAttribute('use')) {
			$this->use = $xml->getAttribute('use');
		}

		$keyInfo = SAML2_Utils::xpQuery($xml, './ds:KeyInfo');
		if (count($keyInfo) > 1) {
			throw new Exception('More than one ds:KeyInfo in the KeyDescriptor.');
		} elseif (empty($keyInfo)) {
			throw new Exception('No ds:KeyInfo in the KeyDescriptor.');
		}
		$this->KeyInfo = new SAML2_XML_ds_KeyInfo($keyInfo[0]);

		foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:EncryptionMethod') as $em) {
			$this->EncryptionMethod[] = new SAML2_XML_Chunk($em);
		}

	}


	/**
	 * Convert this KeyDescriptor to XML.
	 *
	 * @param DOMElement $parent  The element we should append this KeyDescriptor to.
	 */
	public function toXML(DOMElement $parent) {
		assert('is_null($this->use) || is_string($this->use)');
		assert('$this->KeyInfo instanceof SAML2_XML_ds_KeyInfo');
		assert('is_array($this->EncryptionMethod)');

		$doc = $parent->ownerDocument;

		$e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:KeyDescriptor');
		$parent->appendChild($e);

		if (isset($this->use)) {
			$e->setAttribute('use', $this->use);
		}

		$this->KeyInfo->toXML($e);

		foreach ($this->EncryptionMethod as $em) {
			$em->toXML($e);
		}

		return $e;
	}

}
